package models

import (
	"sync"
	"time"

	"github.com/beego/beego/v2/client/orm"
)

// 权限缓存，用于提高性能
var (
	permissionCache     = make(map[int64][]*Permission)
	permissionCacheLock sync.RWMutex
	permissionExpire    = make(map[int64]int64)
)

// GetAdminPermissions 获取管理员的所有权限标识符
func GetAdminPermissions(adminId int64) ([]*Permission, error) {
	// 检查缓存
	permissionCacheLock.RLock()
	if permissions, ok := permissionCache[adminId]; ok {
		// 检查缓存是否过期
		if expireTime, exists := permissionExpire[adminId]; exists && expireTime > time.Now().Unix() {
			permissionCacheLock.RUnlock()
			return permissions, nil
		}
	}
	permissionCacheLock.RUnlock()

	// 缓存不存在或已过期，重新查询
	o := orm.NewOrm()

	// 获取管理员信息
	admin, err := GetAdminById(adminId)
	if err != nil {
		return nil, err
	}

	// 权限映射表
	permissions := make([]*Permission, 0)

	// 如果是总管理员（franchise_id为0），拥有所有权限
	if admin.FranchiseId == 0 && admin.RoleId == 0 {
		_, err = o.QueryTable(new(Permission)).Filter("status", 1).Filter("is_deleted", 0).Filter("type", "api").All(&permissions)
		if err != nil {
			return nil, err
		}

	} else {
		// 非总管理员，只拥有分配的角色权限
		role, _ := GetRoleById(admin.RoleId)
		if role != nil {
			// 检查角色状态
			if role.Status != 1 {
				return permissions, nil
			}

			// 检查角色是否属于该管理员的加盟商
			if role.FranchiseId != 0 && role.FranchiseId != admin.FranchiseId {
				return permissions, nil
			}

			// 获取角色权限
			Permissions, _ := GetPermissionsByRoleId(role.Id)
			if len(Permissions) == 0 {
				return permissions, nil
			}
			// 添加权限到映射表
			for _, perm := range Permissions {
				if perm.Type != "api" {
					continue
				}
				permissions = append(permissions, perm)
			}
		}
	}

	// 更新缓存
	permissionCacheLock.Lock()
	permissionCache[adminId] = permissions
	permissionExpire[adminId] = time.Now().Add(5 * time.Minute).Unix() // 缓存5分钟
	permissionCacheLock.Unlock()

	return permissions, nil
}

// ClearAdminPermissionCache 清除指定管理员的权限缓存
func ClearAdminPermissionCache(adminId int64) {
	permissionCacheLock.Lock()
	delete(permissionCache, adminId)
	delete(permissionExpire, adminId)
	permissionCacheLock.Unlock()
}

// ClearAllPermissionCache 清除所有权限缓存
func ClearAllPermissionCache() {
	permissionCacheLock.Lock()
	permissionCache = make(map[int64][]*Permission)
	permissionExpire = make(map[int64]int64)
	permissionCacheLock.Unlock()
}

// 添加一个通用的加盟商权限检查函数
// CheckFranchisePermission 检查是否具有访问特定加盟商资源的权限
// adminFranchiseId: 管理员所属的加盟商ID
// resourceFranchiseId: 资源所属的加盟商ID
// 返回值: 是否有权限访问
func CheckFranchisePermission(adminFranchiseId, resourceFranchiseId int64) bool {
	// 如果管理员为总部管理员(FranchiseId为0)，则有权限访问所有资源
	if adminFranchiseId == 0 {
		return true
	}

	// 加盟商管理员只能访问自己加盟商的资源
	return adminFranchiseId == resourceFranchiseId
}
